class Person(object):
    __slots__ = ("name", "age", "height", "weight", "money", "run")

    def __init__(self, name, age, height, weight):
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight

    def __del__(self):
        print("object delete")

    def say(self):
        return "my name is %s,I am %d years old"%(self.name, self.age)


per1 = Person("lilei", 20, 170, 80)
per2 = Person("hanmeimei", 18, 165, 50)

# 实例化一个对象后，可以给对象绑定任何的属性和方法，这就是动态语言的灵活性
# 如果属性不存在，则变为增加属性
per1.money = 100
print(per1.money)

# 增加方法
def run(self):
    print("run")
from types import MethodType
per1.run = MethodType(run, per1)
per1.run()

# 注意：给一个实例对象的属性和方法对另一个实例对象没有影响
# print(per2.money)

# 需求：给所有的实例都绑定属性和方法
# 解决：给类绑定就可以
# 注意：不仅仅给已存在的对象绑定，未创建的对象也绑定了
Person.faceValue = 100
def play(self):
    print("play")
Person.play = play
print(per2.faceValue, per1.faceValue)
per2.play()
per1.play()


# 思考：想限制实例的属性，不让对象随意添加属性，只能添加我们绑定的一些属性
# 解决：在定义类时，定义一个特殊属性__slots__,限制该类实例能添加的属性


